﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using CashShop.AccessDateLib;

namespace CashShop.Bussiness
{
    /// <summary>
    /// 通过此类访问折扣促销数据，定义门面Facade
    /// </summary>
   public class CashFacade
    {
        /// <summary>
        /// 读出xml文件内容，保存到string数组中
        /// </summary>
        /// <returns></returns>
        public string[] GetCashAccaptTypeList()
        {
            var cat = new CashAccessType();
            var ds = cat.GetCashAccessType();

            //把ds转换为string[]
            var count = ds.Tables[0].DefaultView.Count;
            string[] result = new string[count];

            //把ds中每行记录的Name值传入数组中
            for (int i = 0; i < count; i++)
            {
                result[i] = ds.Tables[0].DefaultView[i]["Name"].ToString();
            }
            return result;
        }

        /// <summary>
        /// 根据商品活动的不同，计算次商品的实际收费
        /// </summary>
        /// <param name="selectValue">用户选择的活动</param>
        /// <param name="startTotalPrice">商品原价</param>
        /// <returns></returns>
        public decimal GetTotalPrice(string selectValue, decimal startTotalPrice)
        {
            //获取配置文件的活动类型
            var cat = new CashAccessType();
            var cs = new CashStrategy();
            var ds = cat.GetCashAccessType();

            //根据用户选择的活动名称，查出活动信息
            var dataRow = ds.Tables[0].Select("Name='" + selectValue + "'")[0];

            #region 反射技术，根据已知的类名，读dll文件来创建对象
            //获取类名
            var className = dataRow["class"].ToString();
            //获取参数
            string[] args = null;
            if (!string.IsNullOrEmpty(dataRow["para"].ToString()))
            {
                args = dataRow["para"].ToString().Split(',');
            }

            //Assembly.Load 读取对应的dll文件
            //CreateInstance创建dll文件中对应类的对象
            cs.SetBehavior((CashSuper)Assembly.Load("CashShop.Bussiness").CreateInstance("CashShop.Bussiness."+className, false, BindingFlags.Default, null, args, null, null));

            #endregion

            return cs.GetTotal(startTotalPrice);
        }
    }
}
